package com.gsoe.judge.service.impl;


import com.alibaba.fastjson.JSON;
import com.gsoe.base.exception.JudgeException;
import com.gsoe.dto.AIProblemDTO;
import com.gsoe.judge.service.ChatGLMService;
import com.gsoe.judge.utils.ChatGmlUtil;
import com.gsoe.vo.ProblemVO;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class ChatGLMServiceImpl implements ChatGLMService {
    @Override
    public ProblemVO getAIProblem(AIProblemDTO aiProblemDTO) {
        List<String> list=new ArrayList<>();
        if(StringUtils.isNotEmpty(aiProblemDTO.getDescription()))list.add(aiProblemDTO.getDescription());
        list.add("请再出一道不一样的"+aiProblemDTO.getTypeString()+"题，请返回一个JSON格式的字符串，里面包含:");
        list.add("这道题将加入到题库中，因此答案部分必须要有完整的答案");
        list.add("type: 题目类型：1:单选 2:填空 3:判断 4:多选 5:大题");
        list.add("problemDescribe: 题目描述(如果是判断题，开头应为：这个说法是否正确：)");
        list.add("problemCode: 题目所依赖的代码（如果有的话，请使用c++,如果没有请设置为空,不要有```cpp 纯代码）");
        list.add("analysis: 解析");
        list.add("answer: 答案,是一个字符串，单选多选用大写字母组成的一个字符串表示，例如答案为选项1，2，3，则用字符串ABC表示，判断题答案用\"正确\"或\"错误\"表示。填空，大题按实际答案填写,如果答案是代码保留回车占位符，并使用c++");
        list.add("optionDescribe: 选项，是个字符串数组,不需要前面的ABCD 只要选项描述,(只有单选和多选有选项，其他时候请设置为空)");
        list.add("difficulty: 难度，为1~3的整数，1为简单,2为中等,3为困难");
        list.add("在json的内容中不要有多余的说明");
        list.add("请确保你的回复中只包含一个json");

        String res = ChatGmlUtil.testInvoke(list);

        int beginIndex = res.indexOf("{");
        int endIndex = res.lastIndexOf("}");

        String jsonString = res.substring(beginIndex,endIndex+1);
        ProblemVO problemVO=new ProblemVO();
        try{
            problemVO = JSON.parseObject(jsonString,ProblemVO.class);
            problemVO.setTransform(true);
            if(StringUtils.isNotEmpty(problemVO.getProblemCode())){
                problemVO.setCodeLanguage("cpp");
            }
        }catch (Exception e){
            problemVO.setTransform(false);
        }
        problemVO.setAiReply(res);
        return problemVO;
    }
}
